home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 February / Macworld (1999-02).dmg / Cinema 4D GO demo / Plugin / Filter / RAW.cof
Text File  |  1998-03-16  |  7KB  |  412 lines

  1. // Simple Loader/Saver for POV-Ray RAW files
  2. // (c) Christian Losch
  3. // 1997 Maxon Computer GmbH
  4.  
  5.  
  6.  
  7. var fac=50.0;
  8.  
  9. Identify(probe,name)
  10. {
  11.     var s,l = sizeof(name);
  12.  
  13.     if (l<5) return FALSE;
  14.  
  15.     s = strmid(name,l-4,4);
  16.  
  17.     return
  18.         strcmp(s,".RAW")==0 ||
  19.         strcmp(s,".RaW")==0 ||
  20.         strcmp(s,".RAw")==0 ||
  21.         strcmp(s,".Raw")==0 ||
  22.  
  23.         strcmp(s,".rAW")==0 ||
  24.         strcmp(s,".raW")==0 ||
  25.         strcmp(s,".rAw")==0 ||
  26.         strcmp(s,".raw")==0;
  27. }
  28.  
  29. Edit()
  30. {
  31.     var d = new(SimpleDialog);
  32.  
  33.     d->SetTitle("Pov-Ray RAW");
  34.     d->SetData(0,"Version 1.0",FIELD_STRING,0,1,"----");
  35.     d->SetData(1,"Factor",FIELD_FLOAT,0.01,1000000,fac);
  36.     if (!d->DoDialog()) return;
  37.  
  38.     fac=d->GetData(1);
  39.  
  40.     return TRUE;
  41. }
  42.  
  43. // ******************************* Save **************************
  44. AppendLF(name)
  45. {
  46.     var txt=new(string,2);
  47.     txt[0]=0x0D;
  48.     txt[1]=0x0A;
  49.     return stradd(name,txt);
  50. }
  51.  
  52. WriteIt(file,p1,p2,p3)
  53. {
  54.     var t;
  55.  
  56.     p1 /= fac;
  57.     p2 /= fac;
  58.     p3 /= fac;
  59.  
  60.     t = tostring(p1.x);
  61.  
  62.     t=stradd(t," ",tostring(p1.y));
  63.     t=stradd(t," ",tostring(p1.z));
  64.  
  65.     t=stradd(t," ",tostring(p2.x));
  66.     t=stradd(t," ",tostring(p2.y));
  67.     t=stradd(t," ",tostring(p2.z));
  68.  
  69.     t=stradd(t," ",tostring(p3.x));
  70.     t=stradd(t," ",tostring(p3.y));
  71.     t=stradd(t," ",tostring(p3.z));
  72.  
  73.     t = AppendLF(t);
  74.  
  75.     file->Write(t,sizeof(t));
  76. }
  77.  
  78. SaveObject(op,file)
  79. {
  80.     while (op)
  81.     {
  82.         if (getclass(op)==PolygonObject)
  83.         {
  84.             var i,d,v,mg;
  85.             var t,q,name,p1,p2,p3,p4;
  86.  
  87.             mg = new(Matrix); if(!mg) return FALSE;
  88.             t = new(Triangle); if (!t) return FALSE;
  89.             q = new(Quadrangle); if (!q) return FALSE;
  90.  
  91.             d = op->GetTriangleNumber();
  92.             v = op->GetQuadrangleNumber();
  93.  
  94.             // write objects name
  95.             name = AppendLF(op->GetName());
  96.             file->Write(name,sizeof(name));
  97.  
  98.  
  99.             op->GetMg(mg);
  100.  
  101.             // write triangles
  102.             for (i=0; i<d; i++)
  103.             {
  104.                 op->GetTriangle(i,t);
  105.                 p1 = mg->MulP(op->GetPoint(t->a));
  106.                 p2 = mg->MulP(op->GetPoint(t->b));
  107.                 p3 = mg->MulP(op->GetPoint(t->c));
  108.  
  109.                 WriteIt(file,p1,p2,p3);
  110.       }
  111.  
  112.             // write quadrangles
  113.             for (i=0; i<v; i++)
  114.             {
  115.                 op->GetQuadrangle(i,q);
  116.         p1 = mg->MulP(op->GetPoint(q->a));
  117.                 p2 = mg->MulP(op->GetPoint(q->b));
  118.                 p3 = mg->MulP(op->GetPoint(q->c));
  119.                 p4 = mg->MulP(op->GetPoint(q->d));
  120.  
  121.                 WriteIt(file,p1,p2,p3);
  122.                 WriteIt(file,p3,p4,p1);
  123.       }
  124.         }
  125.  
  126.         if (!SaveObject(op->GetDown(),file)) return FALSE;
  127.         op = op->GetNext();
  128.     }
  129.     return TRUE;
  130. }
  131.  
  132. Save(file,doc,obj,mat,env,alert)
  133. {
  134.     var ok;
  135.  
  136.     println("Saving RAW");
  137.  
  138.     if (!file->Open(1)) return FALSE;
  139.  
  140.     ok=SaveObject(doc->GetFirstObject(),file);
  141.  
  142.     file->Close();
  143.     println("Ready");
  144.     return ok;
  145. }
  146.  
  147. // ******************************* Load **************************
  148.  
  149. struct TRI
  150. {
  151.     TRI();
  152.  
  153.     var p1,p2,p3;
  154. };
  155.  
  156. TRI::TRI()
  157. {
  158.     p1 = p2 = p3 = vector(0,0,0);
  159. }
  160.  
  161. GetNextW(s,p)
  162. {
  163.     var i,size = sizeof(s);
  164.  
  165.     if (p>=size) return p;
  166.  
  167.     // search for first whitespace
  168.     if (s[p]==0x20) return p;
  169.     for (i=p; i<size; i++)
  170.     {
  171.         if (s[i]==0x20) break;
  172.     }
  173.     return i;
  174. }
  175.  
  176. GetNextN(s,p)
  177. {
  178.     var i,size = sizeof(s);
  179.  
  180.     if (p>=size) return p;
  181.  
  182.     // search for first non whitespace
  183.     if (s[p]!=0x20) return p;
  184.     for (i=p; i<size; i++)
  185.     {
  186.         if (s[i]!=0x20) break;
  187.     }
  188.     return i;
  189. }
  190.  
  191. GetName(s)
  192. {
  193.     var i,count=0,name,size;
  194.  
  195.     size = sizeof(s);
  196.  
  197.     // count
  198.     for (i=0; i<size; i++)
  199.     {
  200.         if (s[i]!=0x20 && s[i]!=0x0A && s[i]!=0x0D)
  201.             count++;
  202.         else
  203.             break;
  204.     }
  205.  
  206.     name = new(string,count);
  207.  
  208.     // fill
  209.     for (i=0; i<count; i++)
  210.     {
  211.         name[i] = s[i];
  212.     }
  213.     return name;
  214. }
  215.  
  216. GetTriangle(s)
  217. {
  218.     var i,p1,p2,t = new(TRI);
  219.  
  220.     p1=GetNextN(s,0   ); p2=GetNextW(s,p1); t->p1.x = evaluate(s,p1,p2-p1);
  221.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1);    t->p1.y = evaluate(s,p1,p2-p1);
  222.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p1.z = evaluate(s,p1,p2-p1);
  223.  
  224.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1);    t->p2.x = evaluate(s,p1,p2-p1);
  225.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p2.y = evaluate(s,p1,p2-p1);
  226.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p2.z = evaluate(s,p1,p2-p1);
  227.  
  228.  
  229.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p3.x = evaluate(s,p1,p2-p1);
  230.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p3.y = evaluate(s,p1,p2-p1);
  231.     p1=GetNextN(s,p2+1); p2=GetNextW(s,p1); t->p3.z = evaluate(s,p1,p2-p1);
  232.  
  233.     t->p1 *= fac;
  234.     t->p2 *= fac;
  235.     t->p3 *= fac;
  236.     return t;
  237. }
  238.  
  239. IsNumber(c)
  240. {
  241.     return c=='0' || c=='1' || c=='2' || c=='3' || c=='4' || c=='5' || c=='6' || c=='7' || c=='8' || c=='9' ||
  242.            c=='-' || c=='+';
  243. }
  244.  
  245. ReadLine(file,max)
  246. {
  247.     var count,s,pos,c,i;
  248.  
  249.     c=new(string,1);
  250.  
  251.     pos = file->GetPos();
  252.  
  253.     count=0;
  254.  
  255.     // count characters
  256.     do
  257.     {
  258.         file->Read(c,1);
  259.  
  260.         count++;
  261.     }
  262.     while (c[0]!=0x0A && c[0]!=0x0 && (pos+count)<max);
  263.  
  264.     file->SetPos(pos);
  265.  
  266.  
  267.     // load characters
  268.     s=new(string,count);
  269.     for (i=0; i<count; i++)
  270.     {
  271.         file->Read(c,1);
  272.         s[i]=c[0];
  273.     }
  274.  
  275.     return s;
  276. }
  277.  
  278. // 0=nothing
  279. // 1=triangle
  280. // 2=group
  281.  
  282. IdentLine(s)
  283. {
  284.     var i,size=sizeof(s);
  285.  
  286.     for (i=0; i<size; i++)
  287.     {
  288.         if (s[i]!=' ')
  289.         {
  290.             if (IsNumber(s[i]))
  291.                 return 1;
  292.             else
  293.                 return 2;
  294.         }
  295.     }
  296.     return 0;
  297. }
  298.  
  299. CountLines(file,max)
  300. {
  301.     var s,count,ok,pos;
  302.  
  303.     pos = file->GetPos();
  304.     ok=TRUE;
  305.     count=0;
  306.     do
  307.     {
  308.         s = ReadLine(file,max);
  309.         switch (IdentLine(s))
  310.         {
  311.             case 1: count++; break;
  312.             case 2: ok=FALSE;
  313.         }
  314.     }
  315.     while (ok);
  316.     file->SetPos(pos);
  317.     return count;
  318. }
  319.  
  320. Load(file,doc,obj,mat,env,mecker)
  321. {
  322.     var max,op,e,t,s,lines;
  323.     var pn,en,tn; // counter for points,edges,triangles
  324.  
  325.     println("Loading RAW");
  326.  
  327.     if (!file->Open(0)) return FALSE;
  328.  
  329.     max = file->Len();
  330.  
  331.     e = new(Edge);
  332.     t = new(Triangle);
  333.  
  334.     do
  335.     {
  336.         s = ReadLine(file,max);
  337.         switch (IdentLine(s))
  338.         {
  339.             case 0 : // do nothing break;
  340.  
  341.             case 2: // Object name, new group
  342.             {
  343.                 // update last object
  344.                 if (getclass(op)==PolygonObject) op->UpdateObject();
  345.  
  346.                 lines = CountLines(file,max);
  347.  
  348.                 // generate new object
  349.                 op = doc->NewPolygonObject(GetName(s),NULL,NULL,lines*3,lines*3,lines,0);
  350.                 pn=en=tn=0;
  351.  
  352.             }
  353.             break;
  354.  
  355.             case 1:
  356.             {
  357.                 // alloc new object the first time
  358.                 if (getclass(op)!=PolygonObject)
  359.                 {
  360.                     // count triangles
  361.                     lines = CountLines(file,max);
  362.  
  363.                     // generate new object
  364.                     op = doc->NewPolygonObject("Raw",NULL,NULL,lines*3,lines*3,lines,0);
  365.                     pn=en=tn=0;
  366.                 }
  367.  
  368.                 if (getclass(op)==PolygonObject)
  369.                 {
  370.                     var tri;
  371.  
  372.                     tri = GetTriangle(s);
  373.  
  374.                     op->SetPoint(pn++,tri->p1);
  375.                     op->SetPoint(pn++,tri->p2);
  376.                     op->SetPoint(pn++,tri->p3);
  377.  
  378.                     t->a = pn-3;
  379.                     t->b = pn-2;
  380.                     t->c = pn-1;
  381.                     op->SetTriangle(tn++,t);
  382.  
  383.                     e->a = pn-3;
  384.                     e->b = pn-2;
  385.                     op->SetEdge(en++,e);
  386.  
  387.                     e->a = pn-2;
  388.                     e->b = pn-1;
  389.                     op->SetEdge(en++,e);
  390.  
  391.                     e->a = pn-1;
  392.                     e->b = pn-3;
  393.                     op->SetEdge(en++,e);
  394.                 }
  395.             }
  396.         }
  397.     }
  398.     while (file->GetPos()<max);
  399.  
  400.     // update last object
  401.     if (getclass(op)==PolygonObject) op->UpdateObject();
  402.  
  403.     file->Close();
  404.     println("Ready");
  405.     return TRUE;
  406. }
  407.  
  408. main()
  409. {
  410.     RegisterFilterHook(50002,"POV-Ray RAW","Identify","Load","Save","Edit");
  411. }
  412.